package fr.cie.blog.modeldao.sql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import fr.cie.blog.beans.User;
import fr.cie.blog.domainservice.IServiceUser;
import fr.cie.blog.modeldao.services.GestionBaseDeDonnees;
import fr.cie.blog.modeldao.services.Mapper;

/**
 * @author AetM
 * 
 */
public class UserDaoImplSql extends ModelDAO implements IServiceUser {

	/**
	 * Log4J the logger.
	 */
	private static final Logger LOG = Logger.getLogger(UserDaoImplSql.class);

	// ===================================================================== //
	// Sql Properties
	// ===================================================================== //

	/**
	 * mapper ORM Relation to Object.
	 */
	private final Mapper mapper = new Mapper();

	/**
	 * connection.
	 */
	private Connection connection = null;

	/**
	 * result.
	 */
	private ResultSet result = null;

	/**
	 * request.
	 */
	private PreparedStatement request = null;

	/**
	 * stringRequest.
	 */
	private String stringRequest = null;

	// ===================================================================== //
	// Properties business Object User
	// ===================================================================== //

	/**
	 * user.
	 */
	private User user;

	/**
	 * userList.
	 */
	private List<User> userList;

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceGeneric#save(java.lang.Object)
	 */
	@Override
	public final int save(final User pUser) {
		User userBase = null;
		int resultDB = 0;

		try {

			connection = super.getConnection();
			stringRequest = "INSERT INTO user "
					+ "(Name, Role, Login, Password, Surname,"
					+ " Email) VALUES (?, 1, ?, ?, ?, ?);";

			// Statement.RETURN_GENERATED_KEYS => get the generated key of the
			// object after executing the request.
			request = connection.prepareStatement(stringRequest,
					Statement.RETURN_GENERATED_KEYS);
			request.setString(1, pUser.getName());
			request.setString(2, pUser.getLogin());
			request.setString(3, pUser.getPassword());
			request.setString(4, pUser.getSurname());
			request.setString(5, pUser.getEmail());
			LOG.debug(request);
			// Execution de la requête
			resultDB = request.executeUpdate();

			//
			final ResultSet resultSet = request.getGeneratedKeys();
			if (resultSet != null && resultSet.next()) {
				resultDB = (int) resultSet.getLong(1);
			}

			resultSet.close();

		} catch (final SQLException e) {
			LOG.error("create : base ou requete ou contrainte pb ?" + e);
		} finally {

			try {
				// Fermeture de la connexion
				if (result != null) {
					GestionBaseDeDonnees.getInstance().closeResulset(result);
				}
				if (request != null) {
					GestionBaseDeDonnees.getInstance().closeRequest(request);
				}
				if (connection != null) {
					GestionBaseDeDonnees.getInstance().closeConnection(
							connection);
				}
			} catch (final Exception ex) {
				LOG.debug("Erreur lors de la fermeture de la connexion avec "
						+ "la base de données dans la classe UserDaoImplSql "
						+ "fonction create" + ex);
			}

		}

		return resultDB;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceGeneric#delete(java.lang.Object)
	 */
	@Override
	public final int delete(final User pUser) {
		// TODO Auto-generated method stub
		return 0;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceGeneric#findAll()
	 */
	@Override
	public final List<User> findAll() {
		// Variables
		PreparedStatement pRequete = null;
		User pUser;
		String pRequeteString;
		final List<User> pUserList = new ArrayList<User>();

		try {
			// Ouverture d'une connexion
			connection = super.getConnection();

			// requete pour la liste des clients
			pRequeteString = "SELECT * FROM Style WHERE 1 ORDER BY id";
			pRequete = connection.prepareStatement(pRequeteString);

			// Execution de la requête
			result = pRequete.executeQuery();

			// On stocke le resultat dans une liste
			if (result != null) {
				while (result.next()) {
					// On effectue le mapping des attributs avec les champs de
					// la table SQL
					pUser = mapper.mapperUser(result);

					// On ajoute l'objet a la liste des clients
					pUserList.add(pUser);
				}
			}
		} catch (final Exception e) {
			LOG.debug("Erreur dans la requete dans la "
					+ "classe UserDaoImplSql fonction findAll" + e);
		} finally {
			try {
				// Fermeture de la connexion
				if (result != null) {
					GestionBaseDeDonnees.getInstance().closeResulset(result);
				}
				if (pRequete != null) {
					GestionBaseDeDonnees.getInstance().closeRequest(pRequete);
				}
				if (connection != null) {
					GestionBaseDeDonnees.getInstance().closeConnection(
							connection);
				}
			} catch (final Exception ex) {
				LOG.debug("Erreur lors de la fermeture de la connexion avec "
						+ "la base de données dans la classe UserDaoImplSql "
						+ "fonction findAll" + ex);
			}
		}

		// Retourner la liste des clients
		return pUserList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceGeneric#findById(int)
	 */
	@Override
	public final User findById(final long pIdentifier) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceUser#findByLogin(int)
	 */
	@Override
	public final User findByLogin(final String pLogin) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.cie.blog.domainservice.IServiceUser#checkPassword(java.lang.String)
	 */
	@Override
	public final User authenticateUser(final String login,
			final String password) {

		User userBase = null;

		try {

			connection = super.getConnection();
			stringRequest = "SELECT * FROM user "
					+ "WHERE user.login = ? AND user.password = ?";
			request = connection.prepareStatement(stringRequest);
			request.setString(1, login);
			request.setString(2, login);

			// Execution de la requête
			result = request.executeQuery();

			if (result != null && result.first()) {
				userBase = mapper.mapperUser(result);
			}

		} catch (final SQLException e) {
			LOG.error("findUser base ou requete ou contrainte pb ?" + e);
		} finally {

			try {
				// Fermeture de la connexion
				if (result != null) {
					GestionBaseDeDonnees.getInstance().closeResulset(result);
				}
				if (request != null) {
					GestionBaseDeDonnees.getInstance().closeRequest(request);
				}
				if (connection != null) {
					GestionBaseDeDonnees.getInstance().closeConnection(
							connection);
				}
			} catch (final Exception ex) {
				LOG.debug("Erreur lors de la fermeture de la connexion avec "
						+ "la base de données dans la classe UserDaoImplSql "
						+ "fonction checkPassword" + ex);
			}

		}

		return userBase;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.cie.blog.domainservice.IServiceGeneric#update(java.lang.Object)
	 */
	@Override
	public final int update(final User pUser) {
		// TODO Auto-generated method stub
		return 0;
	}

}